# 定义类 - 数据库工具类
import pymysql


class DBTools(object):
    # 建立连接
    @classmethod  # 添加装饰器，变为 "类方法"。 形参修改为 cls
    def __create_conn(cls):
        conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                               password="iHRM_student_2021", database="ihrm", charset="utf8")
        return conn  # 坚决 别 遗漏

    # 查询一条。sql 是将来用户需要执行的 查询 语句
    @classmethod
    def query_one(cls, sql):
        conn = None  # 声明 初值为 None
        cursor = None
        res = None
        try:
            # 2. 创建连接 - 使用 类名.方法名调用。 接收返回值。
            conn = DBTools.__create_conn()
            # 3. 创建游标
            cursor = conn.cursor()
            # 4. 执行 用户提供的 查询SQL 语句
            cursor.execute(sql)
            # 5. 从结果集中 获取 第一条 数据
            res = cursor.fetchone()

        except Exception as err:
            print("查询 SQL错误：", str(err))

        finally:
            # 6. 关闭游标
            cursor.close()
            # 7. 关闭连接
            conn.close()
            # 将 sql 执行的结果，返回给用户
            return res

    # 增删改。 sql 是将来用户需要执行的 增删改 语句。
    @classmethod
    def uid(cls, sql):
        conn = None
        my_cursor = None
        try:
            # 2. 创建连接
            conn = DBTools.__create_conn()
            # 3. 创建游标
            my_cursor = conn.cursor()
            # 4. 执行 增删改 sql 语句
            my_cursor.execute(sql)
            # 5. 提交事务
            conn.commit()
            print("增删改 sql 执行完成！！！")

        except Exception as err:
            print("增删改 sql 执行错误：", str(err))
            # 回滚
            conn.rollback()

        finally:
            # 6. 关闭游标
            my_cursor.close()
            # 7. 关闭连接
            conn.close()


# 添加测试代码
if __name__ == '__main__':
    # 测试 查询语句。select * from t_book;

    # 方法1：按实例方法，调用语法 测试。
    # dbt = DBTools()
    # res = dbt.query_one("select * from t_book;")
    # print("sql查询结果：", res)

    # 方法2：按类方法，调用语法 测试。
    res = DBTools.query_one("select * from t_book;")
    print("sql查询结果：", res)

    # 测试 增删改 语句。 delete from t_book where id = 250;
    # DBTools.uid("delete from t_book where id = 250;")
    DBTools.uid("update t_book set `read`=`read`+1 where id=251;")
